// node_modules和package.json已删除
// 一、将下面异步代码使用Promise的方式改进，改进后如下：
let myPromise = new Promise((resolve, reject) => {
	setTimeout(() => {
		resolve("hello")
	}, 10)
});
myPromise.then(value => {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(value + "lagou")
		}, 10)
	})
}).then(value => {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(value + "I ♥ U")
		}, 10)
	})
}).then(value => {
	console.log(value)
})


// 二、基于以下代码完成下面的4个练习
const fp = require('lodash/fp');
const cars = [
	{
		name: 'a a a ',
		horsepower: '100',
		dollar_value: '1000000',
		in_stock: true
	},
	{
		name: 'b b b',
		horsepower: '200',
		dollar_value: '2000000',
		in_stock: false
	},
	{
		name: 'c c c',
		horsepower: '300',
		dollar_value: '3000000',
		in_stock: false
	},
	{
		name: 'd d d',
		horsepower: '400',
		dollar_value: '4000000',
		in_stock: true
	}
]

// 练习1：使用函数组合fp.flowRight() 重新实现下面这个函数。重新实现后如下：
const isLastInStock = fp.flowRight(fp.prop('in_stock'), fp.last);
console.log(isLastInStock(cars))

// 练习2：使用 fp.flowRight()、fp.prop() 和 fp.first() 获取第一个 car 的 name。重新实现后如下：
const getFirstName = fp.flowRight(fp.prop('name'), fp.first);
console.log(getFirstName(cars));

// 练习3：使用帮助函数_average 重构 averageDollarValue, 使用函数组合方式实现
let _average = function (xs) {
  return fp.reduce(fp.add, 0, xs) / xs.length
}
const averageDollarValue = fp.flowRight(_average, fp.map(cars => cars.dollar_value));
console.log(averageDollarValue(cars))

// 练习4：使用 flowRight 写一个 sanitizeNames() 函数,返回一个下划线连接的小写字符串，把数组中的 name 转换为这种形式：
// 例如：sanitizeNames(["Hello World"]) => ["hello_world"]
let _underscore = fp.replace(/\W+/g, '_') 
// 无需改动,并在sanitizeNames中使用他
const sanitizeNames = fp.flowRight(fp.map(_underscore), fp.map(fp.prop('name')));
console.log(sanitizeNames(cars))




// 三、基于下面提供的代码完成后续练习
const { Maybe, Container } = require('./support.js');

// 练习1：使用fp.add(x,y)和fp.map(f,x) 创建一个能让functor里的值增加的函数ex1
let maybe = Maybe.of([5, 6, 1])
let ex1 = (num) => maybe.map(fp.map(value => fp.add(value, num)))
console.log(ex1(4))

// 练习2：实现一个函数ex2， 能够使用fp.first获取列表的第一个元素
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => xs.map(fp.first)
console.log(ex2()._value)


// 练习3：实现一个函数ex3， 使用safeProp和fp.first找到user的名字的首字母
let safeProp = fp.curry(function (x, o) {
  return Maybe.of(o[x])
})
let user = {id: 2, name: 'Albert'}
let ex3 = safeProp('name', user).map(value => fp.first(value))
console.log(ex3._value)

// 练习3：使用 Maybe 重写 ex4，不要有 if 语句
// let ex4 = function (n){
// 	if(n){
// 		return parseInt(n)
// 	}
// }
let ex4 = n => Maybe.of(n)
	.map(parseInt)
console.log(ex4(123.13)._value)



// 四、见该目录下的myPromise.js文件 源码。